package main

import (
	"sync"
)

// Go 当中同步锁有什么特点？作用是什么？

var (
	// 一个整数类型的计数器，初始值为 0，用于记录递增次数
	counter int
	// 一个互斥锁，用于保护 counter，防止多个 Goroutine 同时修改它导致数据竞争
	mutex sync.Mutex
	// 一个等待组，用于等待所有 Goroutine 完成任务
	wg sync.WaitGroup
)

func _increment() {
	// 使用 defer 确保在 increment 函数返回时调用 wg.Done()，将等待组的计数器减 1，表示当前 Goroutine 已完成任务
	defer wg.Done()

	// 调用 mutex.Lock() 获取互斥锁，确保同一时间只有一个 Goroutine 能执行后续的临界区代码（即修改 counter）
	mutex.Lock()
	// 使用 defer 确保在函数返回时调用 mutex.Unlock()，释放锁。这是 Go 中常见的锁使用模式，确保即使发生 panic 也能正确解锁
	defer mutex.Unlock()

	// 将全局变量 counter 的值递增 1。由于有锁保护，这一操作是线程安全的
	counter++
}

//func main() {
//	// 调用 wg.Add(100)，将等待组的计数器增加 100，表示需要等待 100 个 Goroutine 完成任务
//	wg.Add(100)
//	for i := 0; i < 100; i++ {
//		go _increment()
//	}
//	// 调用 wg.Wait()，阻塞主 Goroutine，直到等待组的计数器归零（即所有 100 个 Goroutine 调用了 wg.Done()）
//	wg.Wait()
//	fmt.Println("Final counter:", counter)
//}
